<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------

namespace Admin\Controller;

/**
 * 模型数据管理控制器
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
class ThinkController extends AdminController {

	/**
	 * 显示指定模型列表数据
	 * @param  String $model 模型标识
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	public function lists($model = null, $p = 0) {
		$model || $this->error('模型名标识必须！');
		$page = intval($p);
		$page = $page ? $page : 1; //默认显示第一页数据

		//获取模型信息
		$model = M('Model')->getByName($model);
		$model || $this->error('模型不存在！');

		//解析列表规则
		$fields = array();
		$grids = preg_split('/[;\r\n]+/s', $model['list_grid']);
		foreach ($grids as &$value) {
			// 字段:标题:链接
			$val = explode(':', $value);
			// 支持多个字段显示
			$field = explode(',', $val[0]);
			$value = array('field' => $field, 'title' => $val[1]);
			if (isset($val[2])) {
				// 链接信息
				$value['href'] = $val[2];
				// 搜索链接信息中的字段信息
				preg_replace_callback('/\[([a-z_]+)\]/', function ($match) use (&$fields) {$fields[] = $match[1];}, $value['href']);
			}
			if (strpos($val[1], '|')) {
				// 显示格式定义
				list($value['title'], $value['format']) = explode('|', $val[1]);
			}
			foreach ($field as $val) {
				$array = explode('|', $val);
				$fields[] = $array[0];
			}
		}
		// 过滤重复字段信息
		$fields = array_unique($fields);
		// 关键字搜索
		$map = array();
		$key = $model['search_key'] ? $model['search_key'] : 'title';
		if (isset($_REQUEST[$key])) {
			$map[$key] = array('like', '%' . $_GET[$key] . '%');
			unset($_REQUEST[$key]);
		}
		// 条件搜索
		foreach ($_REQUEST as $name => $val) {
			if (in_array($name, $fields)) {
				$map[$name] = $val;
			}
		}
		$row = empty($model['list_row']) ? 10 : $model['list_row'];

		//读取模型数据列表
		if ($model['extend']) {
			$name = get_table_name($model['id']);
			$parent = get_table_name($model['extend']);
			$fix = C("DB_PREFIX");

			$key = array_search('id', $fields);
			if (false === $key) {
				array_push($fields, "{$fix}{$parent}.id as id");
			} else {
				$fields[$key] = "{$fix}{$parent}.id as id";
			}

			/* 查询记录数 */
			$count = M($parent)->join("INNER JOIN {$fix}{$name} ON {$fix}{$parent}.id = {$fix}{$name}.id")->where($map)->count();

			// 查询数据
			$data = M($parent)
				->join("INNER JOIN {$fix}{$name} ON {$fix}{$parent}.id = {$fix}{$name}.id")
				/* 查询指定字段，不指定则查询所有字段 */
				->field(empty($fields) ? true : $fields)
				// 查询条件
				->where($map)
				/* 默认通过id逆序排列 */
				->order("{$fix}{$parent}.id DESC")
				/* 数据分页 */
				->page($page, $row)
				/* 执行查询 */
				->select();

		} else {
			in_array('id', $fields) || array_push($fields, 'id');
			$name = parse_name(get_table_name($model['id']), true);
			$data = M($name)
			/* 查询指定字段，不指定则查询所有字段 */
				->field(empty($fields) ? true : $fields)
				// 查询条件
				->where($map)
				/* 默认通过id逆序排列 */
				->order('id DESC')
				/* 数据分页 */
				->page($page, $row)
				/* 执行查询 */
				->select();

			/* 查询记录总数 */
			$count = M($name)->where($map)->count();
		}

		//分页
		if ($count > $row) {
			$page = new \Think\Page($count, $row);
			$page->setConfig('theme', '%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%');
			$this->assign('_page', $page->show());
		}

		$this->assign('model', $model);
		$this->assign('list_grids', $grids);
		$this->assign('list_data', $data);
		$this->meta_title = $model['title'] . '列表';
		$this->display($model['template_list']);
	}

	public function del($model = null, $ids = null) {
		$model = M('Model')->find($model);
		$model || $this->error('模型不存在！');

		$ids = array_unique((array) I('ids', 0));

		if (empty($ids)) {
			$this->error('请选择要操作的数据!');
		}

		$Model = M(get_table_name($model['id']));
		$map = array('id' => array('in', $ids));
		if ($Model->where($map)->delete()) {
			$this->success('删除成功');
		} else {
			$this->error('删除失败！');
		}
	}

	public function edit($model = null, $id = 0) {
		//获取模型信息
		$model = M('Model')->find($model);
		$model || $this->error('模型不存在！');

		if (IS_POST) {
			$Model = D(parse_name(get_table_name($model['id']), 1));
			// 获取模型的字段信息
			$Model = $this->checkAttr($Model, $model['id']);
			if ($Model->create() && $Model->save()) {
				$this->success('保存' . $model['title'] . '成功！', U('lists?model=' . $model['name']));
			} else {
				$this->error($Model->getError());
			}
		} else {
			$fields = get_model_attribute($model['id']);

			//获取数据
			$data = M(get_table_name($model['id']))->find($id);
			$data || $this->error('数据不存在！');

			$this->assign('model', $model);
			$this->assign('fields', $fields);
			$this->assign('data', $data);
			$this->meta_title = '编辑' . $model['title'];
			$this->display($model['template_edit'] ? $model['template_edit'] : '');
		}
	}

	public function add($model = null) {
		//获取模型信息
		$model = M('Model')->where(array('status' => 1))->find($model);
		$model || $this->error('模型不存在！');
		if (IS_POST) {
			$Model = D(parse_name(get_table_name($model['id']), 1));
			// 获取模型的字段信息
			$Model = $this->checkAttr($Model, $model['id']);
			if ($Model->create() && $Model->add()) {
				$this->success('添加' . $model['title'] . '成功！', U('lists?model=' . $model['name']));
			} else {
				$this->error($Model->getError());
			}
		} else {

			$fields = get_model_attribute($model['id']);

			$this->assign('model', $model);
			$this->assign('fields', $fields);
			$this->meta_title = '新增' . $model['title'];
			$this->display($model['template_add'] ? $model['template_add'] : '');
		}
	}

	protected function checkAttr($Model, $model_id) {
		$fields = get_model_attribute($model_id, false);
		$validate = $auto = array();
		foreach ($fields as $key => $attr) {
			if ($attr['is_must']) {
// 必填字段
				$validate[] = array($attr['name'], 'require', $attr['title'] . '必须!');
			}
			// 自动验证规则
			if (!empty($attr['validate_rule'])) {
				$validate[] = array($attr['name'], $attr['validate_rule'], $attr['error_info'] ? $attr['error_info'] : $attr['title'] . '验证错误', 0, $attr['validate_type'], $attr['validate_time']);
			}
			// 自动完成规则
			if (!empty($attr['auto_rule'])) {
				$auto[] = array($attr['name'], $attr['auto_rule'], $attr['auto_time'], $attr['auto_type']);
			} elseif ('checkbox' == $attr['type']) {
				// 多选型
				$auto[] = array($attr['name'], 'arr2str', 3, 'function');
			} elseif ('datetime' == $attr['type']) {
				// 日期型
				$auto[] = array($attr['name'], 'strtotime', 3, 'function');
			}
		}
		return $Model->validate($validate)->auto($auto);
	}
}